#include "MainWindow.h"

#include <QApplication>
#include <QSharedMemory>
#include <QMessageBox>
#include <QDateTime>
#include <QMutex>
#include <QFile>


QMutex logMutex;
void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    // 使用QMutexLocker来自动锁定和解锁互斥锁
    QMutexLocker locker(&logMutex);
    // 如果是调试消息，则不写入日志文件


    QString logMessage;

    // 根据消息类型添加前缀
    switch (type) {
    case QtDebugMsg:
        logMessage = QString("Debug: %1").arg(msg);
        break;
    case QtInfoMsg:
        logMessage = QString("Info: %1").arg(msg);
        break;
    case QtWarningMsg:
        logMessage = QString("Warning: %1").arg(msg);
        break;
    case QtCriticalMsg:
        logMessage = QString("Critical: %1").arg(msg);
        break;
    case QtFatalMsg:
        logMessage = QString("Fatal: %1").arg(msg);
        break;
    }

    // 添加时间戳和消息上下文
    logMessage.prepend(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz "));
    logMessage.append(QString(" (%1:%2, %3)").arg(context.file).arg(context.line).arg(context.function));

    // 将日志消息输出到文件
    QFile file(QString("log_%1.txt").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd")));
    if (file.open(QIODevice::Append | QIODevice::Text)) {
        QTextStream out(&file);
        out << logMessage << "\n";
        file.close();
    } else {
        // 如果无法打开文件，可以输出到标准错误
        fprintf(stderr, "%s\n", logMessage.toLocal8Bit().constData());
    }

    // 对于致命错误，调用QCoreApplication::abort()来终止程序
    if (type == QtFatalMsg) {
        QCoreApplication::instance()->exit();
    }
}



int main(int argc, char *argv[])
{
    // 创建一个共享内存对象
    QSharedMemory sharedMemory("024MatcherQtApplication");

    // 尝试设置共享内存
    if (!sharedMemory.create(1)) {
        // 如果创建失败，说明已经有一个实例在运行
        QMessageBox::warning(nullptr, "警告", "程序已经在运行了");
        return 1; // 退出程序
    }

    qSetMessagePattern("%{if-category}%{category}: %{endif}%{message} %{file}:%{line}");
//    qInstallMessageHandler(myMessageOutput);

    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
